home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-11-08 | 16.1 KB | 527 lines | [TEXT/MPS ] |
- //========================================================================================
- //
- // File: FWStrToo.cpp
- // Release Version: $ 1.0d11 $
- //
- // Copyright: (c) 1993, 1995 by Apple Computer, Inc., all rights reserved.
- //
- //========================================================================================
-
- #include "FWFound.hpp"
-
- #ifndef FWPRISTR_H
- #include "FWPriStr.h"
- #endif
-
- #ifndef FWPRIDEB_H
- #include "FWPriDeb.h"
- #endif
-
- #ifndef FWCHARIT_H
- #include "FWCharIt.h"
- #endif
-
- #ifndef FWSTRTOO_H
- #include "FWStrToo.h"
- #endif
-
- #ifndef FWEXCLIB_H
- #include "FWExcLib.h"
- #endif
-
- #include <ctype.h>
-
- #if FW_LIB_EXPORT_PRAGMAS
- #pragma lib_export on
- #endif
-
- #ifdef FW_BUILD_MAC
- #pragma segment Strings
- #endif
-
- //========================================================================================
- // CLASS FW_CStringTool
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::GetTool
- //----------------------------------------------------------------------------------------
-
- FW_CStringTool*& FW_CStringTool::GetTool()
- {
- // const int kOffset = 166;
- // FW_CStringTool **tool = (FW_CStringTool **)
- // FW_CPrivTaskGlobals::GetTaskGlobals(kOffset);
- static FW_CStringTool *sFW_CStringTool;
- return sFW_CStringTool;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::GetCurrentStringTool
- //----------------------------------------------------------------------------------------
-
- FW_CStringTool* FW_CStringTool::GetCurrentStringTool()
- {
- FW_CStringTool *&gTool = GetTool();
- if (gTool == NULL)
- gTool = FW_NEW(FW_CMinimalStringTool, ());
- return gTool;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::SetCurrentStringTool
- //----------------------------------------------------------------------------------------
-
- FW_CStringTool*
- FW_CStringTool::SetCurrentStringTool(FW_CStringTool* tool)
- {
- FW_CStringTool *&gTool = GetTool();
- FW_CStringTool* prior = gTool;
- gTool = tool;
- return prior;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::FW_CStringTool
- //----------------------------------------------------------------------------------------
-
- FW_CStringTool::FW_CStringTool(FW_Boolean caseSensitive) :
- fCaseSensitive(caseSensitive)
- {
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::~FW_CStringTool
- //----------------------------------------------------------------------------------------
-
- FW_CStringTool::~FW_CStringTool()
- {
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::FW_CStringTool
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CStringTool::SetCaseSensitivity(FW_Boolean caseSensitive)
- {
- FW_Boolean prior = fCaseSensitive;
- fCaseSensitive = caseSensitive;
- return prior;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::ToUpper
- //----------------------------------------------------------------------------------------
-
- void FW_CStringTool::ToUpper(FW_CTextReader &input, FW_CTextWriter &output)
- {
- input.SetPosition(0);
- FW_Char c;
- while ((c=input.GetCharacterAndAdvance()) != FW_kNulCharacter)
- {
- DoConvertToUpper(&c, 1);
- output.PutCharacterAndAdvance(c);
- }
- output.FlushAndUpdateText();
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::ToUpper
- //----------------------------------------------------------------------------------------
-
- void FW_CStringTool::ToUpper(FW_CString &string)
- {
- DoConvertToUpper((FW_Char*) string.fRepresentation, string.fLength);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::ToLower
- //----------------------------------------------------------------------------------------
-
- void FW_CStringTool::ToLower(FW_CTextReader &input, FW_CTextWriter &output)
- {
- input.SetPosition(0);
- FW_Char c;
- while ((c=input.GetCharacterAndAdvance()) != FW_kNulCharacter)
- {
- DoConvertToLower(&c, 1);
- output.PutCharacterAndAdvance(c);
- }
- output.FlushAndUpdateText();
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::ToLower
- //----------------------------------------------------------------------------------------
-
- void FW_CStringTool::ToLower(FW_CString &string)
- {
- DoConvertToLower((FW_Char*) string.fRepresentation, string.fLength);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::CompareStrings
- //----------------------------------------------------------------------------------------
-
- FW_StringCompareResult FW_CStringTool::CompareStrings(
- const FW_CString &string1,
- const FW_CString &string2)
- {
- FW_CStringReader reader1(string1);
- FW_CStringReader reader2(string2);
- return DoCompareStrings(reader1, reader2);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::FindSubString
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CStringTool::FindSubString(
- FW_CTextReader &reader,
- const FW_CString &subString,
- FW_CharacterPosition &foundPosition)
- {
- FW_CStringReader subStringReader(subString);
- return DoFindSubString(reader, subStringReader, foundPosition);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::FindSubString
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CStringTool::FindSubString(
- const FW_CString &string,
- const FW_CString &subString,
- FW_CharacterPosition &foundPosition,
- FW_CharacterPosition startPosition)
- {
- FW_CStringReader stringReader(string);
- FW_CStringReader subStringReader(subString);
- stringReader.SetPosition(startPosition);
- return DoFindSubString(stringReader, subStringReader, foundPosition);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::Substitute
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CStringTool::Substitute(FW_CString &string,
- const FW_CString &searchString,
- const FW_CString &substitutionString)
- {
- FW_CharacterCount position;
- FW_Boolean found = FindSubString(string, searchString, position, 0);
- if (found)
- {
- string.Delete(searchString.GetLength(), position);
- string.Insert(substitutionString, position);
- }
- return found;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::FindCharacter
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CStringTool::FindCharacter(
- const FW_CString &string,
- FW_LChar character,
- FW_CharacterPosition &foundPosition,
- FW_CharacterPosition startPosition,
- FW_FindDirection direction)
- {
- FW_CStringReader reader(string);
- reader.SetPosition(startPosition);
- return DoFindCharacter(reader, character, foundPosition, direction);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::FindWhiteSpace
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CStringTool::FindWhiteSpace(
- const FW_CString &string,
- FW_CharacterPosition &foundPosition,
- FW_CharacterPosition startPosition,
- FW_FindDirection direction)
- {
- FW_CStringReader reader(string);
- reader.SetPosition(startPosition);
- return DoFindWhiteSpace(reader, foundPosition, direction);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::FindNonWhiteSpace
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CStringTool::FindNonWhiteSpace(
- const FW_CString &string,
- FW_CharacterPosition &foundPosition,
- FW_CharacterPosition startPosition,
- FW_FindDirection direction)
- {
- FW_CStringReader reader(string);
- reader.SetPosition(startPosition);
- return DoFindNonWhiteSpace(reader, foundPosition, direction);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::IsWhiteSpace
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CStringTool::IsWhiteSpace(FW_CTextReader &reader)
- {
- return DoIsWhiteSpace(reader.PeekCharacter());
- }
-
- //========================================================================================
- // CLASS FW_CMinimalStringTool
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // FW_CMinimalStringTool::FW_CMinimalStringTool
- //----------------------------------------------------------------------------------------
-
- FW_CMinimalStringTool::FW_CMinimalStringTool(FW_Boolean caseSensitive) :
- FW_CStringTool(caseSensitive)
- {
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CMinimalStringTool::~FW_CMinimalStringTool
- //----------------------------------------------------------------------------------------
-
- FW_CMinimalStringTool::~FW_CMinimalStringTool()
- {
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CMinimalStringTool::DoCompareStrings
- //----------------------------------------------------------------------------------------
-
- FW_StringCompareResult FW_CMinimalStringTool::DoCompareStrings(
- FW_CTextReader &reader1,
- FW_CTextReader &reader2)
- {
- FW_StringCompareResult result = kStringsEqual;
-
- FW_LChar c1;
- FW_LChar c2;
- do
- {
- c1 = reader1.GetCharacterAndAdvance();
- c2 = reader2.GetCharacterAndAdvance();
- if (!fCaseSensitive)
- {
- c1 = ConvertToUpper(c1);
- c2 = ConvertToUpper(c2);
- }
- } while(c1 == c2 && c1 != FW_kNulCharacter);
-
- if (c1 < c2)
- {
- result = kStringOneLess;
- }
- else if (c1 > c2)
- {
- result = kStringOneGreater;
- }
-
- return result;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CMinimalStringTool::DoMatchPrefixString
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CMinimalStringTool::DoMatchPrefixString(
- FW_CTextReader &target,
- FW_CTextReader &prefix)
- {
- FW_LChar t;
- FW_LChar p;
-
- // check for empty prefix string
- if (prefix.GetLength() == 0)
- return FALSE;
-
- do
- {
- t = target.GetCharacterAndAdvance();
- p = prefix.GetCharacterAndAdvance();
- if (!fCaseSensitive)
- {
- t = ConvertToUpper(t);
- p = ConvertToUpper(p);
- }
- } while (p!=FW_kNulCharacter && p==t);
-
- // Either p is FW_kNulCharacter, or p!=t.
- // If p is FW_kNulCharacter, then whether p==t or p!=t, there is a prefix match.
- // If p!=t, then there is not a prefix match only if p!=FW_kNulCharacter.
- // Correct determination of match is therefore p==FW_kNulCharacter.
-
- return p==FW_kNulCharacter;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CMinimalStringTool::DoFindSubString
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CMinimalStringTool::DoFindSubString(
- FW_CTextReader &searchStringReader,
- FW_CTextReader &subStringReader,
- FW_CharacterPosition &foundPosition)
- {
- FW_Boolean match = FALSE;
-
- foundPosition = searchStringReader.GetPosition();
- FW_CharacterPosition lastPosition = searchStringReader.GetLength() -
- subStringReader.GetLength();
- while (foundPosition <= lastPosition)
- {
- subStringReader.SetPosition(0);
- match = DoMatchPrefixString(searchStringReader, subStringReader);
- if (match)
- break;
- searchStringReader.SetPosition(++foundPosition);
- }
-
- return match;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CMinimalStringTool::DoFindCharacter
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CMinimalStringTool::DoFindCharacter(
- FW_CTextReader &reader,
- FW_LChar character,
- FW_CharacterPosition &foundPosition,
- FW_FindDirection direction)
- {
- if (!fCaseSensitive)
- character = ConvertToUpper(character);
-
- FW_LChar c;
- do
- {
- c = reader.PeekCharacter();
- if (!fCaseSensitive)
- c = ConvertToUpper(c);
- if (c == character || c == FW_kNulCharacter)
- break;
- if (direction == FW_kForwards)
- reader.Advance(1);
- else
- reader.Backup(1);
- } while(1);
-
- FW_Boolean match = (c == character);
- if (match)
- foundPosition = reader.GetPosition();
-
- return match;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CMinimalStringTool::DoFindWhiteSpace
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CMinimalStringTool::DoFindWhiteSpace(
- FW_CTextReader &reader,
- FW_CharacterPosition &foundPosition,
- FW_FindDirection direction)
- {
- FW_Boolean match = FALSE;
-
- FW_LChar c = reader.PeekCharacter();
- while (!DoIsWhiteSpace(c) && c != FW_kNulCharacter)
- {
- if (direction == FW_kForwards)
- reader.Advance(1);
- else
- reader.Backup(1);
- c = reader.PeekCharacter();
- }
-
- if (c != FW_kNulCharacter) // not at end of string
- {
- match = TRUE;
- foundPosition = reader.GetPosition();
- }
-
- return match;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CMinimalStringTool::DoFindNonWhiteSpace
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CMinimalStringTool::DoFindNonWhiteSpace(
- FW_CTextReader &reader,
- FW_CharacterPosition &foundPosition,
- FW_FindDirection direction)
- {
- FW_Boolean match = FALSE;
-
- FW_LChar c = reader.PeekCharacter();
- while (DoIsWhiteSpace(c) && c != FW_kNulCharacter)
- {
- if (direction == FW_kForwards)
- reader.Advance(1);
- else
- reader.Backup(1);
- c = reader.PeekCharacter();
- }
-
- if (c != FW_kNulCharacter) // not at end of string
- {
- match = TRUE;
- foundPosition = reader.GetPosition();
- }
-
- return match;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CMinimalStringTool::DoIsWhiteSpace
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CMinimalStringTool::DoIsWhiteSpace(FW_LChar character)
- {
- // Assumes Roman (1-byte) character set
- return (FW_PrimitiveCharacterIsSpace(character) != 0);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CMinimalStringTool::DoConvertToUpper
- //----------------------------------------------------------------------------------------
-
- void FW_CMinimalStringTool::DoConvertToUpper(FW_Char *chars, FW_CharacterCount length)
- {
- // Assumes 1 byte per Roman character
- for (int i=0; i<length; i++)
- chars[i] = FW_PrimitiveCharacterToUpper(chars[i]);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CMinimalStringTool::ConvertToUpper
- //----------------------------------------------------------------------------------------
-
- FW_LChar FW_CMinimalStringTool::ConvertToUpper(FW_LChar character)
- {
- return FW_PrimitiveCharacterToUpper(character);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CMinimalStringTool::DoConvertToLower
- //----------------------------------------------------------------------------------------
-
- void FW_CMinimalStringTool::DoConvertToLower(FW_Char *chars, FW_CharacterCount length)
- {
- // Assumes 1 byte per Roman character
- for (int i=0; i<length; i++)
- chars[i] = FW_PrimitiveCharacterToLower(chars[i]);
- }
-